package collection_try;

import java.util.*;

public class ArrayListIterator_Iterator {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(10);
        list.addAll(Arrays.asList(3, 4, 5, 6, 7, 8));

        // listIterator 专门为list 遍历过程中修改元素或进行双向遍历，则应选择ListIterator
        for(ListIterator<Integer> listIterator = list.listIterator();listIterator.hasNext();){
            listIterator.add(1);
            Object next = listIterator.next();
            System.out.print(next+" ");
        }
        System.out.println();
        System.out.println(list);
       /*
    初始化位置：
        当你通过 list.listIterator(index) 创建一个 ListIterator 时，它实际上被初始化为指向列表中指定索引 index 位置的前一个元素和当前元素之间的间隙。
        但是，请注意，这里的“前一个元素”在 index 为 0 时是不存在的（即列表的开头之前），而“当前元素”在 index 等于列表大小时也是不存在的（即列表的末尾之后）。
    next() 和 previous() 方法：
        next() 方法会使迭代器向前移动到下一个元素，并返回刚刚越过的那个元素的值（即移动之前的间隙后面的元素）。
        previous() 方法会使迭代器向后移动到前一个元素，并返回刚刚越过的那个元素的值（即移动之前的间隙前面的元素）。
    边界条件：
        在调用 next() 之前，如果迭代器已经位于列表的末尾（即 index 等于列表大小，且尚未调用 next()），则 hasNext() 将返回 false，调用 next() 会抛出 NoSuchElementException。
        在调用 previous() 之前，如果迭代器已经位于列表的开头（即 index 为 0，且尚未调用 previous() 或从列表末尾向前移动过），
        则 hasPrevious() 将返回 false，调用 previous() 也会抛出 NoSuchElementException。
    返回值：
        next() 和 previous() 方法返回的都是迭代器当前位置之前的元素的值（在调用这些方法之后，迭代器的位置会改变）。
       */
        for(ListIterator<Integer> listIterator = list.listIterator(list.size());listIterator.hasPrevious();){
//            listIterator.add(1); // 无限添加
            Object pre = listIterator.previous();
            System.out.print(pre+" ");
            // 修改操作
            listIterator.set(9);
            // index 操作
            System.out.println(listIterator.nextIndex());
        }

        //可以适用于任何实现了Iterable接口的集合类，只遍历
        System.out.println();
        Iterator<Integer> it = list.iterator();
        while(it.hasNext()){
            Object next = it.next();
            System.out.print(next+" ");
//            list.add(5); // ArrayList在使用iterator迭代的时候，不可以同时对集合进行添加操作
            it.remove();
        }
        System.out.println();
        System.out.println(list);
    }
}
